library(plotly)
Attaching package: ‘plotly’
The following object is masked from ‘package:ggplot2’:
last_plot
The following object is masked from ‘package:stats’:
filter
The following object is masked from ‘package:graphics’:
layout
#########################################################################
###############function to create data set 2
cd1 <- function() {
t <- c(rep(0,100), rep(1,100))
x1 <- runif(200, 0,5) + t
x2 <- runif(200, 0,5) + t
x3 <- rep(c(rep("A",25), rep("B",25),rep("C",25), rep("D",25)),2)
# t <- c(rep("C",100),rep("T",100))
y <- 2*t + x1 + x2 #+ rnorm(200)
d <- list(x1=x1,x2=x2,x3=x3,t=t,y=y) %>% as.data.frame()
return(d)
}
dists <- function(data, form.t=NULL, model.t=NULL, form.y=NULL, model.y=NULL) {
#get the response variable from the formula
t = all.vars(form.t)[1]
#check the response is binary for logistic regression
if(all(as.numeric(data[t] == data[1,t]) %in% c(0,1))) {
data[t] <- as.numeric(data[t] != data[1,t])
}
#calculate the propensity score using logistic regression
if (is.null(model.t)){
prop.s <- glm(form.t, data=data, family = "binomial") %>% fitted()
}
dt <- cbind(idx= str_pad(row.names(data), nchar(nrow(data)), pad = "0"), data, prop.s)
dt <- dt %>% mutate(prop.wt=ifelse(t==1, 1/prop.s,1/(1-prop.s)))
Q <- quantile(dt$prop.s, prob=seq(from=0,to=1,by=0.2),na.rm=TRUE)
dt$prop.st <- cut(dt$prop.s, breaks = Q, labels = 1:5, include.lowest = TRUE)
return(dt)
}
d1 <- dists(form.t=t ~ x1 + x2, data=cd1())
# a <- glm(t ~ x1 + x2, data=d1, family = "binomial")
# m1 <- glm(ifelse(t=="C",0,1)~x1+x3, data=d1)
# a$model
#
# all.vars(a$terms)
#
# lm(y~t, data = d1)
# lm(y~t, weights = d1$prop.w, data = d1)
#
#
# summary(d1$prop.s)
#
# typeof(a)
# a %>% predict(newdata=d1, type = "response") == a$fitted.values
data <- cd1()
ggplot(data, aes(x1, x2, color=t)) + geom_point()

NA
NA
NA
NA
matches <- dist.matches(f=f, data=mdata)
Error in dist.matches(f = f, data = mdata) :
unused arguments (f = f, data = mdata)
Line <- gvisScatterChart(data[c("x1","x2", "t")],
options=list(
legend="right",
title="Hello World",
titleTextStyle="{color:'red',
fontName:'Courier',
fontSize:16}",
backgroundColor="#D3D3D3",
vAxis="{gridlines:{color:'red', count:3}}",
hAxis="{title:'X1', titleTextStyle:{color:'blue'}}",
series="[{color:'green', targetAxisIndex: 0},
{color: 'orange',targetAxisIndex:1}]",
vAxes="[{title:'val1'}, {title:'val2'}]",
legend="bottom",
curveType="function",
width=500,
height=500
), chartid = 55555)
plot(Line)
df <- gapminder
fig <- mdata %>%
plot_ly(
x = ~x1,
y = ~x2,
# size = ~pop,
color = ~c("No","Yes")[factor(t)],
# text = ~color,
frame = ~prop.st,
# text = paste0(round(~x1,2), ", ",round(~x2,2)),
hovertemplate = '%{color}: %{x:.2f}, %{y:.2f}<extra></extra>',
# hoverinfo = "text",
type = 'scatter',
mode = 'markers'
)
# fig <- fig %>% layout(
#
# xaxis = list(
#
# type = "log"
#
# )
#
# )
print(fig)
Warning in RColorBrewer::brewer.pal(N, "Set2") :
minimal value for n is 3, returning requested palette with 3 different levels
Warning in RColorBrewer::brewer.pal(N, "Set2") :
minimal value for n is 3, returning requested palette with 3 different levels
Warning in RColorBrewer::brewer.pal(N, "Set2") :
minimal value for n is 3, returning requested palette with 3 different levels
Warning in RColorBrewer::brewer.pal(N, "Set2") :
minimal value for n is 3, returning requested palette with 3 different levels
NULL
```r
f1 <- y ~ x2 * x1 * I(x1*x2) * I(x1^2) * I(x2^2) * I(x1^2*x2) * I(x1*x2^2) * I(x1^3) * I(x2^3)
output <- NULL
f1.t <- paste(f1[[2]],f1[[1]],\t\,c(\\,paste(\+\,labels(terms(f1)))))
# f1.t <- \y ~ t + x1 + x2\
# f1.t <- str_replace_all(f1.t, \:\, \+\)
f1.l <- lapply(f1.t,function(x) lm(x, data=d1))
# f1.s <- sapply(f1.t,function(x) lm(x, data=d1, weights= d1$prop.wt))
f1.est <- sapply(1:length(f1.l), function(x) f1.l[[c(x,1,2)]])
output <- rbind(output, cbind(mod=\Vanilla\,var=var(f1.est),max=max(f1.est), av=mean(f1.est)))
plot(f1.est, type = \l\)
# [1] 0.03991049
# [1] 4.200924
f1.l <- lapply(f1.t,function(x) lm(x, data=d1, weights= d1$prop.wt))
# f1.s <- sapply(f1.t,function(x) lm(x, data=d1, weights= d1$prop.wt))
f1.est <- sapply(1:length(f1.l), function(x) f1.l[[c(x,1,2)]])
# var(f1.est) #[[1]][2]
# max(f1.est) #[[1]][2]
output <- rbind(output, cbind(\Weighted\,var(f1.est), max(f1.est),
av=mean(f1.est)))
plot(f1.est, type = \l\)
# [1] 0.005683825
# [1] 2.525635
v <- NULL
for (i in 1:5){
f1.l <- lapply(f1.t,function(x) lm(x, data=d1[d1$prop.st==i,] ))
# f1.s <- sapply(f1.t,function(x) lm(x, data=d1, weights= d1$prop.wt))
# f1.l[[98]]
f1.est <- sapply(1:length(f1.l), function(x) f1.l[[c(x,1,2)]])
v <- rbind(v,cbind(variance=var(f1.est), max=max(f1.est), av=mean(f1.est)))
}
output <- rbind(output, cbind(\Stratified\,apply(v, 2, mean)%>%t())) %>%
as.data.frame()
# d1 %>% select(prop.st, t) %>% group_by_all() %>% mutate(n=n()) %>% unique()
plot(f1.est, type = \l\)
<!-- rnb-source-end -->
<!-- rnb-chunk-end -->
<!-- rnb-text-begin -->
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5kZjEgPC0gZnVsbF9qb2luKGQxLGQxLGJ5PWNoYXJhY3RlcigpLHN1ZmZpeCA9IGMoXFxcXCwgXFwueVxcKSkgJT4lIGZpbHRlcih0ICE9IHQueSkgJT4lIG11dGF0ZShwLmRpc3Q9YWJzKHByb3AucyAtIHByb3Aucy55KSlcblxuXG5wLm1hdGNoZXMgPC0gTlVMTFxuIyBtLm1hdGNoZXMgPC0gTlVMTFxucC5pZHMgPC0gbGlzdChpZHg9TlVMTCxpZHgueT1OVUxMKVxuIyBtLmlkcyA8LSBsaXN0KGlkPU5VTEwsc19pZD1OVUxMKVxuXG5mb3IgKGkgaW4gMToobnJvdyhkZjEpKSkge1xuICAgIFxuICAgIGlmIChucm93KGRmMSAlPiUgZmlsdGVyKCFpZHgueSAlaW4lIHAuaWRzJGlkeC55LCAhaWR4ICVpbiUgcC5pZHMkaWR4KSkhPTApIHtcbiAgICBcbiAgICBwIDwtIGRmMSAlPiUgZmlsdGVyKCFpZHgueSAlaW4lIHAuaWRzJGlkeC55LCAhaWR4ICVpbiUgcC5pZHMkaWR4KSAlPiUgXG4gICAgICAgICAgZmlsdGVyKHAuZGlzdCA9PSBtaW4ocC5kaXN0KSkgXG4gICAgcC5tYXRjaGVzIDwtIHJiaW5kKHAubWF0Y2hlcywgcClcbiAgICBwLmlkcyA8LSBwLm1hdGNoZXNbYyhcXGlkeFxcLCBcXGlkeC55XFwpXVxuICAgIFxuICAgICMgbSA8LSBkZjMgJT4lIGZpbHRlcighc19pZCAlaW4lIG0uaWRzJHNfaWQsICFpZCAlaW4lIG0uaWRzJGlkKSAlPiUgXG4gICAgIyAgICAgICBmaWx0ZXIobS5kaXN0ID09IG1pbihtLmRpc3QpKSBcbiAgICAjIG0ubWF0Y2hlcyA8LSByYmluZChtLm1hdGNoZXMsIG0pXG4gICAgIyBtLmlkcyA8LSBtLm1hdGNoZXNbYyhcXGlkXFwsIFxcc19pZFxcKV1cbiAgICB9XG4gICAgXG59XG5cblxuZG0gPC0gYXMubWF0cml4KHAubWF0Y2hlc1ssYygneDEnLCd4MicpXS1wLm1hdGNoZXNbLGMoJ3gxLnknLCd4Mi55JyldKVxuXG4jY292YXJpYW5jZSBtYXRyaXhcbmMgPC0gY292KGQxWyxjKCd4MScsJ3gyJyldKVxuXG4jIHNvbHZlICAoY292YXJpYW5jZSBtYXRyaXgpICUqJSB4ID0gZCBmb3IgeFxuY292LmQgPC0gc2FwcGx5KDE6bnJvdyhwLm1hdGNoZXMpLCBmdW5jdGlvbih4KSBzb2x2ZShjLGRtW3gsXSkpICU+JSB0KClcblxuIyBNYWhhbGFub2JpcyBjYWxjdWxhdGlvbiBmb3JjZWQgaW4gdHdvIHN0ZXBzXG5wLm1hdGNoZXMkbS5kaXN0IDwtIGFwcGx5KGRtKmNvdi5kLCAxLCBzdW0pXG5cblxucC5tYXRjaGVzICU+JSByb3d3aXNlKCkgJT4lIFxuICAgIG11dGF0ZShhPXgxLXgxLnksIGI9eDIteDIueSxcbiAgICAgICAgICAgbS5kID0gc3VtKGMoYSxiKSpzb2x2ZShjb3YoZDFbLGMoJ3gxJywneDInKV0pLCBjKGEsYikpKSkgJT4lIHNlbGVjdCgtYSwgLWIpXG5cblxuYGBgXG5gYGAifQ== -->
```r
```r
df1 <- full_join(d1,d1,by=character(),suffix = c(\\, \.y\)) %>% filter(t != t.y) %>% mutate(p.dist=abs(prop.s - prop.s.y))
p.matches <- NULL
# m.matches <- NULL
p.ids <- list(idx=NULL,idx.y=NULL)
# m.ids <- list(id=NULL,s_id=NULL)
for (i in 1:(nrow(df1))) {
if (nrow(df1 %>% filter(!idx.y %in% p.ids$idx.y, !idx %in% p.ids$idx))!=0) {
p <- df1 %>% filter(!idx.y %in% p.ids$idx.y, !idx %in% p.ids$idx) %>%
filter(p.dist == min(p.dist))
p.matches <- rbind(p.matches, p)
p.ids <- p.matches[c(\idx\, \idx.y\)]
# m <- df3 %>% filter(!s_id %in% m.ids$s_id, !id %in% m.ids$id) %>%
# filter(m.dist == min(m.dist))
# m.matches <- rbind(m.matches, m)
# m.ids <- m.matches[c(\id\, \s_id\)]
}
}
dm <- as.matrix(p.matches[,c('x1','x2')]-p.matches[,c('x1.y','x2.y')])
#covariance matrix
c <- cov(d1[,c('x1','x2')])
# solve (covariance matrix) %*% x = d for x
cov.d <- sapply(1:nrow(p.matches), function(x) solve(c,dm[x,])) %>% t()
# Mahalanobis calculation forced in two steps
p.matches$m.dist <- apply(dm*cov.d, 1, sum)
p.matches %>% rowwise() %>%
mutate(a=x1-x1.y, b=x2-x2.y,
m.d = sum(c(a,b)*solve(cov(d1[,c('x1','x2')]), c(a,b)))) %>% select(-a, -b)
<!-- rnb-source-end -->
<!-- rnb-chunk-end -->
<!-- rnb-text-begin -->
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG4jIGpvaW4oZDEscC5tYXRjaGVzLFxcXFwpXG5cbmVzdHMgPC0gTlVMTFxuYiA8LSBOVUxMXG5cbmZvciAoaSBpbiBzZXEoMSwobnJvdyhwLm1hdGNoZXMpLTkpLGJ5PTIpKXtcbiAgICBcbiAgICBkYXRhIDwtIHAubWF0Y2hlcyAlPiUgYXJyYW5nZShkZXNjKHAuZGlzdCksdCkgJT4lIC5baTpucm93KHAubWF0Y2hlcyksXVxuICAgIFxuICAgIGJhbHMgPC0gYmFsLnRhYih0IH4geDEgKyB4MiwgZGF0YSA9IGRhdGEsIFxuICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IFxccHJvcC5zXFwsIHMuZC5kZW5vbSA9IFxcdHJlYXRlZFxcKVxuXG4gICAgYiA8LSByYmluZChiLGxpc3QoeDEuYmFsID0gYmFscyRCYWxhbmNlWzIsMl0sIHgyLmJhbCA9IGJhbHMkQmFsYW5jZVsxLDJdKSAlPiUgXG4gICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgpKVxuICAgIFxuICAgIGYxLmwgPC0gbGFwcGx5KGYxLnQsZnVuY3Rpb24oeCkgbG0oeCwgZGF0YT1kYXRhKSlcbiAgICBcbiAgICAjIGYxLnMgPC0gc2FwcGx5KGYxLnQsZnVuY3Rpb24oeCkgbG0oeCwgZGF0YT1kMSwgd2VpZ2h0cz0gZDEkcHJvcC53dCkpXG4gICAgXG4gICAgIyBmMS5sW1s5OF1dXG4gICAgXG4gICAgZjEuZXN0IDwtIHNhcHBseSgxOmxlbmd0aChmMS5sKSwgZnVuY3Rpb24oeCkgZjEubFtbYyh4LDEsMildXSlcbiAgICBcbiAgICBlc3RzIDwtIHJiaW5kKGVzdHMsY2JpbmQobj1pLHZhcmlhbmNlPXZhcihmMS5lc3QpLCBtYXg9bWF4KGYxLmVzdCksIGF2PW1lYW4oZjEuZXN0KSkpXG5cbn1cblxuZXN0cyA8LSBlc3RzICU+JSBhcy5kYXRhLmZyYW1lKClcbm91dHB1dCA8LSBvdXRwdXQgJT4lIGFzLmRhdGEuZnJhbWUoKVxuXG5jb2xuYW1lcyhvdXRwdXQpPC0gYyhcXG1vZGVsXFwsIFxcdmFyc1xcLCBcXG1heC52YWxcXCwgXFxhdlxcKVxuXG5vdXRwdXQkdmFycyA8LSBvdXRwdXQkdmFycyAlPiUgYXMubnVtZXJpYygpXG5cbm91dHB1dCRtYXgudmFsIDwtIG91dHB1dCRtYXgudmFsICU+JSBhcy5udW1lcmljKClcblxuYGBgXG5gYGAifQ== -->
```r
```r
# join(d1,p.matches,\\)
ests <- NULL
b <- NULL
for (i in seq(1,(nrow(p.matches)-9),by=2)){
data <- p.matches %>% arrange(desc(p.dist),t) %>% .[i:nrow(p.matches),]
bals <- bal.tab(t ~ x1 + x2, data = data,
distance = \prop.s\, s.d.denom = \treated\)
b <- rbind(b,list(x1.bal = bals$Balance[2,2], x2.bal = bals$Balance[1,2]) %>%
as.data.frame())
f1.l <- lapply(f1.t,function(x) lm(x, data=data))
# f1.s <- sapply(f1.t,function(x) lm(x, data=d1, weights= d1$prop.wt))
# f1.l[[98]]
f1.est <- sapply(1:length(f1.l), function(x) f1.l[[c(x,1,2)]])
ests <- rbind(ests,cbind(n=i,variance=var(f1.est), max=max(f1.est), av=mean(f1.est)))
}
ests <- ests %>% as.data.frame()
output <- output %>% as.data.frame()
colnames(output)<- c(\model\, \vars\, \max.val\, \av\)
output$vars <- output$vars %>% as.numeric()
output$max.val <- output$max.val %>% as.numeric()
<!-- rnb-source-end -->
<!-- rnb-chunk-end -->
<!-- rnb-text-begin -->
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2dwbG90KHAubWF0Y2hlcywgYWVzKHgxLHgyLCBjb2xvciA9IGFzLmZhY3Rvcih0KSkpICsgXG4gIGFubm90YXRlKFxccmVjdFxcLCB4bWluPTAsIHhtYXg9NSwgeW1pbj0wLCB5bWF4PTUsIGFscGhhPTAuMSwgZmlsbD1cXGJsdWVcXCkgKyBcbiAgYW5ub3RhdGUoXFxyZWN0XFwsIHhtaW49MSwgeG1heD02LCB5bWluPTEsIHltYXg9NiwgYWxwaGE9MC4xLCBmaWxsPVxccmVkXFwpICtcbiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKFxcYmx1ZVxcLCBcXHJlZFxcKSwgbmFtZT1cXEdyb3VwXFwsIGxhYmVscyA9IGMoXFxDb250cm9sXFwsXFxUcmVhdFxcKSkgK1xuICBnZW9tX3NlZ21lbnQoZGF0YT1wLm1hdGNoZXNbcC5tYXRjaGVzJHQ9PTAsXSxcbiAgICAgICAgICAgICAgIGFlcyh4PXgxLHhlbmQ9eDEueSx5PXgyLHllbmQ9eDIueSwgXG4gICAgICAgICAgICAgICAgICAgYWxwaGE9Y3V0KHJhbmsocC5kaXN0KSw0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygxLDIsMyw0KSkpLCBcbiAgICAgICAgICAgICAgIGNvbG9yPSBcXGJsYWNrXFwsIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjIsXFxjbVxcKSkpICtcbiAgICBzY2FsZV9hbHBoYV9kaXNjcmV0ZShuYW1lPVxcQ3V0c1xcLCBsYWJlbHM9YyhcXDFzdFxcLCBcXDJuZFxcLCBcXDNyZFxcLCBcXDR0aFxcKSwgcmFuZ2UgPSBjKDEsMC4xKSkgK1xuICBnZW9tX3BvaW50KCkgKyB0aGVtZV9jbGFzc2ljKCkgXG5cblxuZ2dwbG90KHAubWF0Y2hlc1twLm1hdGNoZXMkdD09MCxdLCBhZXMocHJvcC5zLHByb3Aucy55LCBjb2xvcj1wLmRpc3QpKSArIFxuICBnZW9tX2FibGluZShzbG9wZT0xKSArIGdlb21fcG9pbnQoKSArIHRoZW1lX2NsYXNzaWMoKSArIGxpbXMoeD1jKDAsMSkseT1jKDAsMSkpIFxuXG5nZ3Bsb3QocC5tYXRjaGVzW3AubWF0Y2hlcyR0PT0wLF0sIGFlcyhwcm9wLnMscHJvcC53dCwgY29sb3I9cHJvcC5zdCkpICsgXG4gZ2VvbV9wb2ludChhbHBoYT0wLjcpICsgdGhlbWVfY2xhc3NpYygpIyArIGxpbXMoeD1jKDAsMSkseT1jKDAsMSkpIFxuXG5nZ3Bsb3QocC5tYXRjaGVzW3AubWF0Y2hlcyR0PT0wLF0sIGFlcyhwLmRpc3QsIG0uZGlzdCwgY29sb3I9cHJvcC5zdCkpICsgXG4gZ2VvbV9wb2ludChhbHBoYT0wLjcpICsgdGhlbWVfY2xhc3NpYygpIyArIGxpbXMoeD1jKDAsMSkseT1jKDAsMSkpIFxuXG5nZ3Bsb3QocC5tYXRjaGVzW3AubWF0Y2hlcyR0PT0wLF0sIGFlcyhwcm9wLnMsbS5kaXN0LCBjb2xvcj1wcm9wLnN0KSkgKyBcbiBnZW9tX3BvaW50KGFscGhhPTAuNykgKyB0aGVtZV9jbGFzc2ljKCkjICsgbGltcyh4PWMoMCwxKSx5PWMoMCwxKSkgXG5cbmBgYFxuYGBgIn0= -->
```r
```r
ggplot(p.matches, aes(x1,x2, color = as.factor(t))) +
annotate(\rect\, xmin=0, xmax=5, ymin=0, ymax=5, alpha=0.1, fill=\blue\) +
annotate(\rect\, xmin=1, xmax=6, ymin=1, ymax=6, alpha=0.1, fill=\red\) +
scale_color_manual(values=c(\blue\, \red\), name=\Group\, labels = c(\Control\,\Treat\)) +
geom_segment(data=p.matches[p.matches$t==0,],
aes(x=x1,xend=x1.y,y=x2,yend=x2.y,
alpha=cut(rank(p.dist),4,
labels=c(1,2,3,4))),
color= \black\, arrow = arrow(length = unit(0.2,\cm\))) +
scale_alpha_discrete(name=\Cuts\, labels=c(\1st\, \2nd\, \3rd\, \4th\), range = c(1,0.1)) +
geom_point() + theme_classic()
ggplot(p.matches[p.matches$t==0,], aes(prop.s,prop.s.y, color=p.dist)) +
geom_abline(slope=1) + geom_point() + theme_classic() + lims(x=c(0,1),y=c(0,1))
ggplot(p.matches[p.matches$t==0,], aes(prop.s,prop.wt, color=prop.st)) +
geom_point(alpha=0.7) + theme_classic()# + lims(x=c(0,1),y=c(0,1))
ggplot(p.matches[p.matches$t==0,], aes(p.dist, m.dist, color=prop.st)) +
geom_point(alpha=0.7) + theme_classic()# + lims(x=c(0,1),y=c(0,1))
ggplot(p.matches[p.matches$t==0,], aes(prop.s,m.dist, color=prop.st)) +
geom_point(alpha=0.7) + theme_classic()# + lims(x=c(0,1),y=c(0,1))
<!-- rnb-source-end -->
<!-- rnb-chunk-end -->
<!-- rnb-text-begin -->
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5nZ2FycmFuZ2UoXG5nZ3Bsb3QoZXN0cywgYWVzKG4sIHZhcmlhbmNlKSkgKyBnZW9tX2xpbmUoKSArIFxuICAgIGdlb21faGxpbmUoZGF0YSA9IG91dHB1dCwgYWVzKHlpbnRlcmNlcHQ9dmFycywgY29sb3I9bW9kZWwpKSArXG4gICAgbGFicyh4PVxcTnVtYmVyIG9mIHVuaXRzIHJlbW92ZWRcXCwgeT1cXEF2ZXJhZ2UgZXN0aW1hdGUgdmFyaWFuY2VcXCksXG5cbmdncGxvdChlc3RzLCBhZXMobiwgbWF4KSkgKyBnZW9tX2xpbmUoKSArIFxuICAgIGdlb21faGxpbmUoZGF0YSA9IG91dHB1dCwgYWVzKHlpbnRlcmNlcHQ9bWF4LnZhbCwgY29sb3I9bW9kZWwpKSArXG4gICAgbGFicyh4PVxcTnVtYmVyIG9mIHVuaXRzIHJlbW92ZWRcXCwgeT1cXE1heGltdW0gZXN0aW1hdGVcXCksXG5cbmdncGxvdChlc3RzLCBhZXMobiwgYXYpKSArIGdlb21fbGluZSgpICsgXG4gICAgZ2VvbV9obGluZShkYXRhID0gb3V0cHV0LCBhZXMoeWludGVyY2VwdD1hcy5udW1lcmljKGF2KSwgY29sb3I9bW9kZWwpKSArIFxuICAgIGxhYnMoeD1cXE51bWJlciBvZiB1bml0cyByZW1vdmVkXFwsIHk9XFxBdmVyYWdlIGVzdGltYXRlXFwpLFxuY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9IFxcYm90dG9tXFxcbikgJT4lIGFubm90YXRlX2ZpZ3VyZSh0b3AgPSBcXE91dHB1dCBmb3IgNTEyIG1vZGVscyBpbmNsdWRpbmcgc2Vjb25kIGFuZCB0aGlyZCBvcmRlciBpbnRlcmFjdGlvbnNcXClcblxuYGBgXG5gYGAifQ== -->
```r
```r
ggarrange(
ggplot(ests, aes(n, variance)) + geom_line() +
geom_hline(data = output, aes(yintercept=vars, color=model)) +
labs(x=\Number of units removed\, y=\Average estimate variance\),
ggplot(ests, aes(n, max)) + geom_line() +
geom_hline(data = output, aes(yintercept=max.val, color=model)) +
labs(x=\Number of units removed\, y=\Maximum estimate\),
ggplot(ests, aes(n, av)) + geom_line() +
geom_hline(data = output, aes(yintercept=as.numeric(av), color=model)) +
labs(x=\Number of units removed\, y=\Average estimate\),
common.legend = T, legend = \bottom\
) %>% annotate_figure(top = \Output for 512 models including second and third order interactions\)
<!-- rnb-source-end -->
<!-- rnb-chunk-end -->
<!-- rnb-text-begin -->
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG4jIGNvdnMgPC0gc3Vic2V0KHAubWF0Y2hlcywgc2VsZWN0ID0gYyh4MSwgeDIsIHQpKVxuIyBcbiMgYmFsLnRhYihjb3ZzLCB0cmVhdCA9IHAubWF0Y2hlcyR0KVxuIyBiYWwudGFiKGNvdnMsIHRyZWF0ID0gcC5tYXRjaGVzJHQsIHdlaWdodHMgPSBwLm1hdGNoZXMkcHJvcC53dClcblxuIyBiYWxzIDwtIGJhbC50YWIodCB+IHgxICsgeDIsIGRhdGEgPSBwLm1hdGNoZXMsIGRpc3RhbmNlID0gXFxwcm9wLnNcXCwgcy5kLmRlbm9tID0gXFx0cmVhdGVkXFwpXG5cbiMgYmFscyRCYWxhbmNlW2MoMjpucm93KGJhbHMkQmFsYW5jZSkpLDJdXG5cbmJhbC53dCA8LSBiYWwudGFiKHQgfiB4MSArIHgyLCBkYXRhID0gcC5tYXRjaGVzLCB3ZWlnaHRzID0gXFxwcm9wLnd0XFwsXG4gICAgICAgIGRpc3RhbmNlID0gXFxwcm9wLnNcXCwgcy5kLmRlbm9tID0gXFx0cmVhdGVkXFwsIHVuYmFsPVQpJEJhbGFuY2VcblxuIyAgICAgICAgICAgIFR5cGUgRGlmZi5BZGpcbiMgcHJvcC5zIERpc3RhbmNlICAgMC4wNjkxXG4jIHgxICAgICAgQ29udGluLiAgIDAuMDUyOVxuIyB4MiAgICAgIENvbnRpbi4gICAwLjA5MzJcblxuXG5iYWwuc3RyYXQgPC0gYmFsLnRhYih0IH4geDEgKyB4MiwgZGF0YSA9IHAubWF0Y2hlcywgc3ViY2xhc3MgPSBcXHByb3Auc3RcXCxcbiAgICAgICAgZGlzdGFuY2UgPSBcXHByb3Auc1xcLCBzLmQuZGVub20gPSBcXHRyZWF0ZWRcXCwgXG4gICAgICAgIHdoaWNoLnN1YmNsYXNzID0gLmFsbCwgc3ViY2xhc3Muc3VtbWFyeSA9IFRSVUUpJEJhbGFuY2VcblxuYGBgXG5gYGAifQ== -->
```r
```r
# covs <- subset(p.matches, select = c(x1, x2, t))
#
# bal.tab(covs, treat = p.matches$t)
# bal.tab(covs, treat = p.matches$t, weights = p.matches$prop.wt)
# bals <- bal.tab(t ~ x1 + x2, data = p.matches, distance = \prop.s\, s.d.denom = \treated\)
# bals$Balance[c(2:nrow(bals$Balance)),2]
bal.wt <- bal.tab(t ~ x1 + x2, data = p.matches, weights = \prop.wt\,
distance = \prop.s\, s.d.denom = \treated\, unbal=T)$Balance
# Type Diff.Adj
# prop.s Distance 0.0691
# x1 Contin. 0.0529
# x2 Contin. 0.0932
bal.strat <- bal.tab(t ~ x1 + x2, data = p.matches, subclass = \prop.st\,
distance = \prop.s\, s.d.denom = \treated\,
which.subclass = .all, subclass.summary = TRUE)$Balance
<!-- rnb-source-end -->
<!-- rnb-chunk-end -->
<!-- rnb-text-begin -->
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5nZ2FycmFuZ2UoXG5nZ3Bsb3QoYiwgYWVzKHg9cm93KGIpWywxXSkpICsgZ2VvbV9saW5lKGFlcyh5PXgxLmJhbCwgY29sb3I9XFxNYXRjaGVkXFwpKSArXG4gICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1iYWwud3RbMiwzXSwgY29sb3I9XFxXZWlnaHRlZFxcKSwgKSArXG4gICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1iYWwuc3RyYXRbMiwzXSwgY29sb3I9XFxTdHJhdGlmaWVkXFwpKSArXG4gICAgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxyaWdodFxcKSArXG4gICAgZ2VvbV9yaWJib24oYWVzKHltaW49LTAuMSx5bWF4PTAuMSksIGFscGhhPTAuMikgK1xuICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcYmxhY2tcXCwgXFxkYXJrYmx1ZVxcLCBcXGJsdWVcXCksIFxuICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gXFxNZXRob2RcXCkgKyBsYWJzKHRpdGxlPVxceDFcXCx4PVxcXFwseT1cXFxcKSxcbmdncGxvdChiLCBhZXMoeD1yb3coYilbLDFdKSkgKyBnZW9tX2xpbmUoYWVzKHk9eDIuYmFsLCBjb2xvcj1cXHgyIE1hdGNoXFwpKSArIFxuICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9YmFsLnd0WzMsM10sIGNvbG9yPVxceDIgV3RcXCkpICtcbiAgICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PWJhbC5zdHJhdFszLDNdLCBjb2xvcj1cXHgyIFN0cmF0XFwpKSArXG4gICAgZ2VvbV9yaWJib24oYWVzKHltaW49LTAuMSx5bWF4PTAuMSksIGFscGhhPTAuMikgK1xuICAgIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFxccmlnaHRcXCkgK1xuICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFxcYmxhY2tcXCwgXFxibHVlXFwsIFxcZGFya3JlZFxcKSwgXG4gICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBcXENvdmFyaWF0ZVxcKSArIGxhYnModGl0bGU9XFx4MlxcLHg9XFxcXCx5PVxcXFwpLFxuY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9IFxcdG9wXFxcblxuKSAlPiUgYW5ub3RhdGVfZmlndXJlKHRvcCA9IFxcQ292YXJpYXRlIGJhbGFuY2UgYnkgZGlmZmVyZW5jZSBpbiBzdGFuZGFyaXNlZCBtZWFuc1xcLCBcbiAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gXFxTdGFuZGFyZGlzZWQgbWVhbiBkaWZmZXJlbmNlXFwsXG4gICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gXFxOdW1iZXIgb2YgcGFpcnMgcmVtb3ZlZFxcKVxuYGBgXG5gYGAifQ== -->
```r
```r
ggarrange(
ggplot(b, aes(x=row(b)[,1])) + geom_line(aes(y=x1.bal, color=\Matched\)) +
geom_hline(aes(yintercept=bal.wt[2,3], color=\Weighted\), ) +
geom_hline(aes(yintercept=bal.strat[2,3], color=\Stratified\)) +
theme_classic() + theme(legend.position = \right\) +
geom_ribbon(aes(ymin=-0.1,ymax=0.1), alpha=0.2) +
scale_color_manual(values = c(\black\, \darkblue\, \blue\),
name = \Method\) + labs(title=\x1\,x=\\,y=\\),
ggplot(b, aes(x=row(b)[,1])) + geom_line(aes(y=x2.bal, color=\x2 Match\)) +
geom_hline(aes(yintercept=bal.wt[3,3], color=\x2 Wt\)) +
geom_hline(aes(yintercept=bal.strat[3,3], color=\x2 Strat\)) +
geom_ribbon(aes(ymin=-0.1,ymax=0.1), alpha=0.2) +
theme_classic() + theme(legend.position = \right\) +
scale_color_manual(values = c(\black\, \blue\, \darkred\),
name = \Covariate\) + labs(title=\x2\,x=\\,y=\\),
common.legend = T, legend = \top\
) %>% annotate_figure(top = \Covariate balance by difference in standarised means\,
left = \Standardised mean difference\,
bottom = \Number of pairs removed\)
<!-- rnb-source-end -->
<!-- rnb-chunk-end -->
<!-- rnb-text-begin -->
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBmb3IgKGkgaW4gMToyMDApIHtcbiMgc2FwcGx5KDIwMCwgZnVuY3Rpb24oeCkgZm9yKGkgaW4gMTp4KSB7bWVhbihybm9ybSgyMDApKX0pXG4jIH1cbmBgYFxuYGBgIn0= -->
```r
```r
# for (i in 1:200) {
# sapply(200, function(x) for(i in 1:x) {mean(rnorm(200))})
# }
<!-- rnb-source-end -->
<!-- rnb-chunk-end -->
<!-- rnb-text-begin -->
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGlzdGFuY2UgPC0gZml0dGVkKGdsbSh0cmVhdH5hZ2UrZWR1YyxsYWxvbmRlLCBmYW1pbHk9XFxiaW5vbWlhbFxcKSlcblxuc3Byb2JzIDwtIHNlcSgwLCAxLCBsZW5ndGgub3V0ID0gcm91bmQoNikgKyAxKVxuXG5xdWFudGlsZShkaXN0YW5jZVtsYWxvbmRlJHRyZWF0PT0xXSwgcHJvYnMgPSBzcHJvYnMsIG5hLnJtID0gVFJVRSlcblxuYGBgXG5gYGAifQ== -->
```r
```r
distance <- fitted(glm(treat~age+educ,lalonde, family=\binomial\))
sprobs <- seq(0, 1, length.out = round(6) + 1)
quantile(distance[lalonde$treat==1], probs = sprobs, na.rm = TRUE)
<!-- rnb-source-end -->
<!-- rnb-chunk-end -->
<!-- rnb-text-begin -->
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxub3B0bWF0Y2g6Om1hdGNoX29uKGRpc3RhbmNlLCB6PWxhbG9uZGUkdHJlYXQpXG5cbmBgYCJ9 -->
```r
optmatch::match_on(distance, z=lalonde$treat)
An object of class "DenseMatrix"
control
treatment 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
1 0.0344197445 0.0544716613 0.0653984572 0.022009534 0.0552959617 0.0025286797 0.0246904028 0.0859393864 0.007008826 0.010202874 0.0248871414 0.032257993 0.009930094 0.0393595932 0.078239007
2 0.0364328109 0.0163808942 0.0054540982 0.092862089 0.0155565937 0.0733812351 0.0461621526 0.0150868309 0.077861382 0.081055430 0.0957396968 0.038594563 0.060922461 0.0314929622 0.007386452
control
treatment 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
1 0.034868512 0.0552959617 0.0401606405 0.010913833 0.006592504 0.046563399 0.0409629647 0.0058493302 0.045976877 0.0133687600 0.0423573652 0.002005214 0.015105517 0.076127653 0.0393595932
2 0.105721067 0.0155565937 0.0306919150 0.081766388 0.064260051 0.024289157 0.0298895907 0.0650032252 0.116829432 0.0842213155 0.0284951903 0.068847341 0.085958073 0.005275098 0.0314929622
control
treatment 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
1 0.0767549377 0.056728339 0.0493862865 0.037979008 0.0544716613 0.0493862865 0.014608307 0.0596040046 0.053753811 0.023017835 0.0752742364 0.0496032463 0.0596040046 0.0805856355 0.015925664
2 0.0059023823 0.014124217 0.0214662689 0.108831563 0.0163808942 0.0214662689 0.056244248 0.0112485508 0.124606367 0.093870391 0.0044216810 0.0212493091 0.0112485508 0.0097330801 0.054926892
control
treatment 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
1 0.0859393864 0.089821929 0.0596040046 0.0393595932 0.0859393864 0.031101061 0.0610472562 0.0128505183 0.010202874 0.019902128 0.0338383126 0.079096301 0.029529804 0.0058493302 0.0524422100
2 0.0150868309 0.018969374 0.0112485508 0.0314929622 0.0150868309 0.039751495 0.0098052992 0.0837030737 0.081055430 0.050950427 0.0370142428 0.008243745 0.041322751 0.0650032252 0.0184103455
control
treatment 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
1 0.004020805 0.0708525554 0.016127944 0.008441925 0.051436026 0.0487874847 0.0267457681 0.06457150 0.0413391937 0.0415528334 0.038631920 0.0443486785 0.0493862865 0.056728339 0.008251782
2 0.066831750 0.0000000000 0.054724611 0.079294480 0.122288581 0.0220650708 0.0975983235 0.13542406 0.0295133617 0.0292997220 0.109484476 0.0265038769 0.0214662689 0.014124217 0.079104338
control
treatment 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275
1 0.0544716613 0.06821907 0.008251782 0.077382826 0.0641671299 0.0700061951 0.0596040046 0.0639445018 0.000000000 0.012143422 0.0883125844 0.050977968 0.091334442 0.103130260 0.036591195
2 0.0163808942 0.13907163 0.079104338 0.006530270 0.0066854255 0.0008463604 0.0112485508 0.0069080536 0.070852555 0.082995977 0.0174600290 0.121830523 0.020481887 0.032277704 0.034261360
control
treatment 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290
1 0.0399475884 0.0737969247 0.072323024 0.043762994 0.0596040046 0.043762994 0.0647824766 0.0859393864 0.0443486785 0.0426495738 0.06587304 0.0967697159 0.0805856355 0.0426495738 0.0805856355
2 0.0309049670 0.0029443692 0.001470469 0.114615549 0.0112485508 0.114615549 0.0060700789 0.0150868309 0.0265038769 0.1135021292 0.13672559 0.0259171605 0.0097330801 0.1135021292 0.0097330801
control
treatment 291 292 293 294 295 296 297 298 299 300 301 302 303 304
1 0.0138505243 0.091334442 0.0280985437 0.0850734147 0.0859393864 0.058167978 0.0457522991 0.0691609868 0.0387722879 0.0844383142 0.0393595932 0.0700061951 0.0844383142 0.0267457681
2 0.0570020311 0.020481887 0.0989510991 0.0142208593 0.0150868309 0.129020534 0.0251002564 0.0016915686 0.0320802675 0.0135857588 0.0314929622 0.0008463604 0.0135857588 0.0975983235
control
treatment 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
1 0.0250683014 0.0508033402 0.0381856737 0.0596040046 0.0967697159 0.0350018758 0.0493862865 0.0952460701 0.0575559600 0.0700061951 0.0532996840 0.091334442 0.067079651 0.057111949 0.089821929
2 0.0959208569 0.0200492152 0.0326668817 0.0112485508 0.0259171605 0.0358506796 0.0214662689 0.0243935146 0.0132965955 0.0008463604 0.1241522394 0.020481887 0.003772904 0.127964504 0.018969374
control
treatment 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
1 0.0829404943 0.0844383142 0.0805856355 0.010202874 0.0030617991 0.0868064317 0.0279190820 0.078466777 0.0700061951 0.010481106 0.0967697159 0.0297602314 0.003824400 0.0618811225 0.057111949
2 0.0120879389 0.0135857588 0.0097330801 0.081055430 0.0739143545 0.0159538763 0.0987716374 0.007614222 0.0008463604 0.060371449 0.0259171605 0.1006127868 0.067028155 0.0089714330 0.127964504
control
treatment 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
1 0.0737969247 0.091334442 0.07307488 0.0805856355 0.0647824766 0.005304578 0.0874436877 0.0946019439 0.0937255052 0.0443486785 0.0624940950 0.012143422 0.062787644 0.049892943 0.0946019439
2 0.0029443692 0.020481887 0.14392743 0.0097330801 0.0060700789 0.065547977 0.0165911322 0.0237493885 0.0228729498 0.0265038769 0.0083584605 0.082995977 0.133640199 0.120745498 0.0237493885
control
treatment 350 351 352 353 354 355 356 357 358 359 360 361 362 363
1 0.0344197445 0.0275978248 0.0737969247 0.0493862865 0.0552959617 0.0835742152 0.099178152 0.0138862389 0.092208046 0.0596040046 0.0799547031 0.0928500992 0.089821929 0.0752742364
2 0.0364328109 0.0432547306 0.0029443692 0.0214662689 0.0155565937 0.0127216597 0.028325597 0.0847387943 0.021355491 0.0112485508 0.0091021477 0.0219975438 0.018969374 0.0044216810
control
treatment 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378
1 0.0952460701 0.077610299 0.0647824766 0.0952460701 0.099178152 0.099178152 0.0937255052 0.06661790 0.0952460701 0.099178152 0.0544716613 0.016320532 0.0967697159 0.0714746749 0.090693717
2 0.0243935146 0.006757744 0.0060700789 0.0243935146 0.028325597 0.028325597 0.0228729498 0.13747046 0.0243935146 0.028325597 0.0163808942 0.087173087 0.0259171605 0.0006221195 0.019841162
control
treatment 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
1 0.0415528334 0.0140518189 0.0952460701 0.0145898418 0.0835742152 0.036591195 0.021440475 0.043121480 0.0814459497 0.0136493259 0.033410401 0.104669382 0.0967697159 0.012143422 0.103130260
2 0.0292997220 0.0568007365 0.0243935146 0.0854423972 0.0127216597 0.034261360 0.049412081 0.113974036 0.0105933943 0.0572032296 0.104262956 0.033816827 0.0259171605 0.082995977 0.032277704
control
treatment 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408
1 0.104669382 0.0346304230 0.0859393864 0.0853034947 0.101594087 0.0844383142 0.007884573 0.016687154 0.030105994 0.0976496996 0.1000608899 0.0287461457 0.091334442 0.012143422 0.058613765
2 0.033816827 0.0362221324 0.0150868309 0.0144509392 0.030741531 0.0135857588 0.062967982 0.054165401 0.040746561 0.0267971442 0.0292083345 0.0421064098 0.020481887 0.082995977 0.129466321
control
treatment 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
1 0.008966595 0.090693717 0.010202874 0.100709622 0.0915665540 0.091334442 0.0536485817 0.0952460701 0.0889511946 0.0859393864 0.0928500992 0.0589940729 0.0493862865 0.0868064317 0.06500611
2 0.079819150 0.019841162 0.081055430 0.029857066 0.0207139986 0.020481887 0.0172039737 0.0243935146 0.0180986392 0.0150868309 0.0219975438 0.0118584825 0.0214662689 0.0159538763 0.13585867
control
treatment 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438
1 0.0952460701 0.104669382 0.0967697159 0.033410401 0.0835742152 0.000732180 0.0820782812 0.022514069 0.0891825426 0.0114349122 0.077837852 0.0260383370 0.103130260 0.1000608899 0.076127653
2 0.0243935146 0.033816827 0.0259171605 0.104262956 0.0127216597 0.070120375 0.0112257257 0.093366624 0.0183299871 0.0822874676 0.006985297 0.0448142185 0.032277704 0.0292083345 0.005275098
control
treatment 439 440 441 442 443 444 445 446 447 448 449 450 451 452
1 0.0752742364 0.068541180 0.0961242884 0.0746483845 0.0937255052 0.0647824766 0.0647824766 0.103130260 0.0799547031 0.0255681533 0.0961242884 0.0853034947 0.0976496996 0.0835742152
2 0.0044216810 0.002311375 0.0252717330 0.0037958290 0.0228729498 0.0060700789 0.0060700789 0.032277704 0.0091021477 0.0964207088 0.0252717330 0.0144509392 0.0267971442 0.0127216597
control
treatment 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467
1 0.103130260 0.0714746749 0.103130260 0.100709622 0.043121480 0.022006538 0.0952460701 0.0700061951 0.0937255052 0.0883125844 0.1000608899 0.0473757512 0.104669382 0.099178152 0.099178152
2 0.032277704 0.0006221195 0.032277704 0.029857066 0.113974036 0.048846018 0.0243935146 0.0008463604 0.0228729498 0.0174600290 0.0292083345 0.0234768042 0.033816827 0.028325597 0.028325597
control
treatment 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482
1 0.0641671299 0.0393595932 0.099178152 0.053753811 0.0829404943 0.0071996172 0.0883125844 0.0952460701 0.0985306947 0.0693855400 0.029529804 0.0844383142 0.100709622 0.0532996840 0.047245634
2 0.0066854255 0.0314929622 0.028325597 0.124606367 0.0120879389 0.0780521727 0.0174600290 0.0243935146 0.0276781393 0.0014670154 0.041322751 0.0135857588 0.029857066 0.1241522394 0.118098190
control
treatment 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497
1 0.044872095 0.0138505243 0.0693855400 0.0493862865 0.031679174 0.060869179 0.0250683014 0.045157598 0.011785551 0.033410401 0.0737969247 0.0752742364 0.068541180 0.07674388 0.0573358510
2 0.115724650 0.0570020311 0.0014670154 0.0214662689 0.039173381 0.131721734 0.0959208569 0.025694957 0.059067004 0.104262956 0.0029443692 0.0044216810 0.002311375 0.14759644 0.0135167044
control
treatment 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512
1 0.0151655274 0.0737969247 0.029529804 0.091334442 0.0618811225 0.0058493302 0.0814459497 0.0641671299 0.009180777 0.0700061951 0.036591195 0.0604358000 0.0937255052 0.037979008 0.0820782812
2 0.0556870280 0.0029443692 0.041322751 0.020481887 0.0089714330 0.0650032252 0.0105933943 0.0066854255 0.061671778 0.0008463604 0.034261360 0.0104167554 0.0228729498 0.108831563 0.0112257257
control
treatment 513 514 515 516 517 518 519 520 521 522 523 524 525 526
1 0.0407495735 0.0850734147 0.0812171614 0.0647824766 0.0889511946 0.0823073606 0.0868064317 0.091334442 0.0874436877 0.091334442 0.0445635754 0.0502029595 0.0700061951 0.0814459497
2 0.0301029819 0.0142208593 0.0103646060 0.0060700789 0.0180986392 0.0114548051 0.0159538763 0.020481887 0.0165911322 0.020481887 0.0262889800 0.0206495959 0.0008463604 0.0105933943
control
treatment 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541
1 0.0829404943 0.0045637979 0.0077260788 0.0976496996 0.08061326 0.0387722879 0.091334442 0.005040552 0.103130260 0.099178152 0.0647824766 0.089821929 0.060709290 0.0868064317 0.008061540
2 0.0120879389 0.0662887575 0.0785786342 0.0267971442 0.15146582 0.0320802675 0.020481887 0.075893108 0.032277704 0.028325597 0.0060700789 0.018969374 0.131561845 0.0159538763 0.078914096
control
treatment 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556
1 0.0952460701 0.1000608899 0.079096301 0.07771755 0.001270624 0.0544716613 0.06821907 0.0532996840 0.101594087 0.103130260 0.0937255052 0.0133687600 0.101594087 0.103130260 0.0573358510
2 0.0243935146 0.0292083345 0.008243745 0.14857010 0.069581932 0.0163808942 0.13907163 0.1241522394 0.030741531 0.032277704 0.0228729498 0.0842213155 0.030741531 0.032277704 0.0135167044
control
treatment 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
1 0.0814459497 0.0859393864 0.0952460701 0.038631920 0.0961242884 0.103130260 0.031679174 0.019902128 0.0151655274 0.0820782812 0.0379734621 0.091334442 0.0187761110 0.091334442 0.0859393864
2 0.0105933943 0.0150868309 0.0243935146 0.109484476 0.0252717330 0.032277704 0.039173381 0.050950427 0.0556870280 0.0112257257 0.0328790933 0.020481887 0.0520764445 0.020481887 0.0150868309
control
treatment 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586
1 0.07965223 0.089821929 0.0952460701 0.044403071 0.103130260 0.099178152 0.0032546278 0.009930094 0.06457150 0.043292142 0.103130260 0.0961242884 0.0522241111 0.0037867205 0.099178152
2 0.15050479 0.018969374 0.0243935146 0.115255627 0.032277704 0.028325597 0.0741071832 0.060922461 0.13542406 0.114144697 0.032277704 0.0252717330 0.0186284444 0.0746392760 0.028325597
control
treatment 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601
1 0.101594087 0.045509682 0.07674388 0.0850734147 0.104669382 0.0700061951 0.038631920 0.099178152 0.015992796 0.0937255052 0.06457150 0.099178152 0.0930826909 0.032080363 0.0151655274
2 0.030741531 0.116362237 0.14759644 0.0142208593 0.033816827 0.0008463604 0.109484476 0.028325597 0.086845351 0.0228729498 0.13542406 0.028325597 0.0222301355 0.102932918 0.0556870280
control
treatment 602 603 604 605 606 607 608 609 610 611 612 613 614
1 0.101594087 0.0493862865 0.06543996 0.0199399478 0.07576599 0.103130260 0.046563399 0.0624940950 0.0952460701 0.0490042020 0.089590375 0.0153674479 0.103130260
2 0.030741531 0.0214662689 0.13629251 0.0907925033 0.14661854 0.032277704 0.024289157 0.0083584605 0.0243935146 0.0218483535 0.018737820 0.0554851075 0.032277704
[ reached getOption("max.print") -- omitted 183 rows ]
Slot "call":
optmatch::match_on(x = distance, z = lalonde$treat)
dist()
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KE1hdGNoSXQpCmxpYnJhcnkoY2VtKQpsaWJyYXJ5KGdncHVicikKbGlicmFyeShjb2JhbHQpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGdhcG1pbmRlcikKCmBgYAoKCgpgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyNmdW5jdGlvbiB0byBjcmVhdGUgZGF0YSBzZXQgMgpjZDEgPC0gZnVuY3Rpb24oKSB7CiAgICAKICAgIHQgPC0gYyhyZXAoMCwxMDApLCByZXAoMSwxMDApKQogICAgeDEgPC0gcnVuaWYoMjAwLCAwLDUpICsgdAogICAgeDIgPC0gcnVuaWYoMjAwLCAwLDUpICsgdAogICAgeDMgPC0gcmVwKGMocmVwKCJBIiwyNSksIHJlcCgiQiIsMjUpLHJlcCgiQyIsMjUpLCByZXAoIkQiLDI1KSksMikKICAgICMgdCA8LSBjKHJlcCgiQyIsMTAwKSxyZXAoIlQiLDEwMCkpCiAgICB5IDwtIDIqdCArIHgxICsgeDIgIysgcm5vcm0oMjAwKQoKICAgIGQgPC0gbGlzdCh4MT14MSx4Mj14Mix4Mz14Myx0PXQseT15KSAlPiUgYXMuZGF0YS5mcmFtZSgpCgogICAgcmV0dXJuKGQpCn0KCgpkaXN0cyA8LSBmdW5jdGlvbihkYXRhLCBmb3JtLnQ9TlVMTCwgbW9kZWwudD1OVUxMLCBmb3JtLnk9TlVMTCwgbW9kZWwueT1OVUxMKSB7CiAgICAKICAgICNnZXQgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGZyb20gdGhlIGZvcm11bGEKICAgIHQgPSBhbGwudmFycyhmb3JtLnQpWzFdCiAgICAKICAgICNjaGVjayB0aGUgcmVzcG9uc2UgaXMgYmluYXJ5IGZvciBsb2dpc3RpYyByZWdyZXNzaW9uCiAgICBpZihhbGwoYXMubnVtZXJpYyhkYXRhW3RdID09IGRhdGFbMSx0XSkgJWluJSBjKDAsMSkpKSB7CiAgICAgICAgZGF0YVt0XSA8LSBhcy5udW1lcmljKGRhdGFbdF0gIT0gZGF0YVsxLHRdKQogICAgfQogICAgCiAgICAjY2FsY3VsYXRlIHRoZSBwcm9wZW5zaXR5IHNjb3JlIHVzaW5nIGxvZ2lzdGljIHJlZ3Jlc3Npb24KICAgIGlmIChpcy5udWxsKG1vZGVsLnQpKXsKICAgICAgICBwcm9wLnMgPC0gZ2xtKGZvcm0udCwgZGF0YT1kYXRhLCBmYW1pbHkgPSAiYmlub21pYWwiKSAlPiUgZml0dGVkKCkKICAgIH0KICAgIAogICAgCiAgICAKICAgIGR0IDwtIGNiaW5kKGlkeD0gc3RyX3BhZChyb3cubmFtZXMoZGF0YSksIG5jaGFyKG5yb3coZGF0YSkpLCBwYWQgPSAiMCIpLCBkYXRhLCBwcm9wLnMpCiAgICAKICAgIGR0IDwtIGR0ICU+JSBtdXRhdGUocHJvcC53dD1pZmVsc2UodD09MSwgMS9wcm9wLnMsMS8oMS1wcm9wLnMpKSkKICAgIAogICAgUSA8LSBxdWFudGlsZShkdCRwcm9wLnMsIHByb2I9c2VxKGZyb209MCx0bz0xLGJ5PTAuMiksbmEucm09VFJVRSkKICAgIGR0JHByb3Auc3QgPC0gY3V0KGR0JHByb3AucywgYnJlYWtzID0gUSwgbGFiZWxzID0gMTo1LCBpbmNsdWRlLmxvd2VzdCA9IFRSVUUpCiAgICAKICAgIHJldHVybihkdCkKfQoKZDEgPC0gZGlzdHMoZm9ybS50PXQgfiB4MSArIHgyLCBkYXRhPWNkMSgpKQoKCiMgYSA8LSBnbG0odCB+IHgxICsgeDIsIGRhdGE9ZDEsIGZhbWlseSA9ICJiaW5vbWlhbCIpIAojIG0xIDwtIGdsbShpZmVsc2UodD09IkMiLDAsMSl+eDEreDMsIGRhdGE9ZDEpCiMgYSRtb2RlbAojIAojIGFsbC52YXJzKGEkdGVybXMpCiMgCiMgbG0oeX50LCBkYXRhID0gZDEpCiMgbG0oeX50LCB3ZWlnaHRzID0gZDEkcHJvcC53LCBkYXRhID0gZDEpCiMgCiMgCiMgc3VtbWFyeShkMSRwcm9wLnMpCiMgCiMgdHlwZW9mKGEpCgojIGEgJT4lIHByZWRpY3QobmV3ZGF0YT1kMSwgdHlwZSA9ICJyZXNwb25zZSIpID09IGEkZml0dGVkLnZhbHVlcwoKZGF0YSA8LSBjZDEoKQoKZ2dwbG90KGRhdGEsIGFlcyh4MSwgeDIsIGNvbG9yPXQpKSArIGdlb21fcG9pbnQoKSAKCgoKCmBgYAoKYGBge3J9CmYgPC0gdCB+IHgxICsgeDIKbWRhdGEgPC0gZGlzdHMoZGF0YSwgZm9ybS50ID0gZikKbWF0Y2hlcyA8LSBkaXN0Lm1hdGNoZXMoZj1mLCBkYXRhPW1kYXRhKQpgYGAKCgoKYGBge3J9CgpMaW5lIDwtICBndmlzU2NhdHRlckNoYXJ0KGRhdGFbYygieDEiLCJ4MiIsICJ0IildLAogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9bGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZD0icmlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9IkhlbGxvIFdvcmxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlVGV4dFN0eWxlPSJ7Y29sb3I6J3JlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250TmFtZTonQ291cmllcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZToxNn0iLAogICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yPSIjRDNEM0QzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHZBeGlzPSJ7Z3JpZGxpbmVzOntjb2xvcjoncmVkJywgY291bnQ6M319IiwKICAgICAgICAgICAgICAgICAgICAgICAgIGhBeGlzPSJ7dGl0bGU6J1gxJywgdGl0bGVUZXh0U3R5bGU6e2NvbG9yOidibHVlJ319IiwKICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllcz0iW3tjb2xvcjonZ3JlZW4nLCB0YXJnZXRBeGlzSW5kZXg6IDB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjb2xvcjogJ29yYW5nZScsdGFyZ2V0QXhpc0luZGV4OjF9XSIsCiAgICAgICAgICAgICAgICAgICAgICAgICB2QXhlcz0iW3t0aXRsZTondmFsMSd9LCB7dGl0bGU6J3ZhbDInfV0iLAogICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kPSJib3R0b20iLAogICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVUeXBlPSJmdW5jdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD01MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9NTAwCiAgICAgICAgICAgICAgICAgICAgICAgKSwgY2hhcnRpZCA9IDU1NTU1KQpwbG90KExpbmUpCgpgYGAKCgpgYGB7cn0KCmRmIDwtIGdhcG1pbmRlciAKCmZpZyA8LSBtZGF0YSAlPiUKCiAgcGxvdF9seSgKCiAgICB4ID0gfngxLCAKCiAgICB5ID0gfngyLCAKCiAgICAjIHNpemUgPSB+cG9wLCAKCiAgICBjb2xvciA9IH5jKCJObyIsIlllcyIpW2ZhY3Rvcih0KV0sIAogICAgCiAgICAjIHRleHQgPSB+Y29sb3IsCgogICAgZnJhbWUgPSB+cHJvcC5zdCwKCiAgICAjIHRleHQgPSBwYXN0ZTAocm91bmQofngxLDIpLCAiLCAiLHJvdW5kKH54MiwyKSksCiAgICAKICAgIGhvdmVydGVtcGxhdGUgPSAnJXtjb2xvcn06ICV7eDouMmZ9LCAle3k6LjJmfTxleHRyYT48L2V4dHJhPicsCgogICAgIyBob3ZlcmluZm8gPSAidGV4dCIsCgogICAgdHlwZSA9ICdzY2F0dGVyJywKCiAgICBtb2RlID0gJ21hcmtlcnMnCgogICkKCiMgZmlnIDwtIGZpZyAlPiUgbGF5b3V0KAojIAojICAgICB4YXhpcyA9IGxpc3QoCiMgCiMgICAgICAgdHlwZSA9ICJsb2ciCiMgCiMgICAgICkKIyAKIyAgICkKCgpwcmludChmaWcpCgpgYGAKCgoKYGBge3J9CmYxIDwtIHkgfiB4MiAqIHgxICogSSh4MSp4MikgKiBJKHgxXjIpICogSSh4Ml4yKSAqIEkoeDFeMip4MikgKiBJKHgxKngyXjIpICogSSh4MV4zKSAqIEkoeDJeMykKCm91dHB1dCA8LSBOVUxMCgoKZjEudCA8LSBwYXN0ZShmMVtbMl1dLGYxW1sxXV0sInQiLGMoIiIscGFzdGUoIisiLGxhYmVscyh0ZXJtcyhmMSkpKSkpCgojIGYxLnQgPC0gInkgfiB0ICsgeDEgKyB4MiIKCiMgZjEudCA8LSBzdHJfcmVwbGFjZV9hbGwoZjEudCwgIjoiLCAiKyIpCgoKZjEubCA8LSBsYXBwbHkoZjEudCxmdW5jdGlvbih4KSBsbSh4LCBkYXRhPWQxKSkKCiMgZjEucyA8LSBzYXBwbHkoZjEudCxmdW5jdGlvbih4KSBsbSh4LCBkYXRhPWQxLCB3ZWlnaHRzPSBkMSRwcm9wLnd0KSkKCmYxLmVzdCA8LSBzYXBwbHkoMTpsZW5ndGgoZjEubCksIGZ1bmN0aW9uKHgpIGYxLmxbW2MoeCwxLDIpXV0pCgpvdXRwdXQgPC0gcmJpbmQob3V0cHV0LCBjYmluZChtb2Q9IlZhbmlsbGEiLHZhcj12YXIoZjEuZXN0KSxtYXg9bWF4KGYxLmVzdCksIGF2PW1lYW4oZjEuZXN0KSkpCgpwbG90KGYxLmVzdCwgdHlwZSA9ICJsIikKCiMgWzFdIDAuMDM5OTEwNDkKIyBbMV0gNC4yMDA5MjQKCmYxLmwgPC0gbGFwcGx5KGYxLnQsZnVuY3Rpb24oeCkgbG0oeCwgZGF0YT1kMSwgd2VpZ2h0cz0gZDEkcHJvcC53dCkpCgojIGYxLnMgPC0gc2FwcGx5KGYxLnQsZnVuY3Rpb24oeCkgbG0oeCwgZGF0YT1kMSwgd2VpZ2h0cz0gZDEkcHJvcC53dCkpCgpmMS5lc3QgPC0gc2FwcGx5KDE6bGVuZ3RoKGYxLmwpLCBmdW5jdGlvbih4KSBmMS5sW1tjKHgsMSwyKV1dKQoKCgojIHZhcihmMS5lc3QpICAjW1sxXV1bMl0KIyBtYXgoZjEuZXN0KSAgI1tbMV1dWzJdCgpvdXRwdXQgPC0gcmJpbmQob3V0cHV0LCBjYmluZCgiV2VpZ2h0ZWQiLHZhcihmMS5lc3QpLCBtYXgoZjEuZXN0KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2PW1lYW4oZjEuZXN0KSkpCnBsb3QoZjEuZXN0LCB0eXBlID0gImwiKQojIFsxXSAwLjAwNTY4MzgyNQojIFsxXSAyLjUyNTYzNQoKdiA8LSBOVUxMCgpmb3IgKGkgaW4gMTo1KXsKICAgIAoKCmYxLmwgPC0gbGFwcGx5KGYxLnQsZnVuY3Rpb24oeCkgbG0oeCwgZGF0YT1kMVtkMSRwcm9wLnN0PT1pLF0gKSkKCiMgZjEucyA8LSBzYXBwbHkoZjEudCxmdW5jdGlvbih4KSBsbSh4LCBkYXRhPWQxLCB3ZWlnaHRzPSBkMSRwcm9wLnd0KSkKCiMgZjEubFtbOThdXQoKZjEuZXN0IDwtIHNhcHBseSgxOmxlbmd0aChmMS5sKSwgZnVuY3Rpb24oeCkgZjEubFtbYyh4LDEsMildXSkKCnYgPC0gcmJpbmQodixjYmluZCh2YXJpYW5jZT12YXIoZjEuZXN0KSwgbWF4PW1heChmMS5lc3QpLCBhdj1tZWFuKGYxLmVzdCkpKQoKfQoKb3V0cHV0IDwtIHJiaW5kKG91dHB1dCwgY2JpbmQoIlN0cmF0aWZpZWQiLGFwcGx5KHYsIDIsIG1lYW4pJT4ldCgpKSkgJT4lCiAgICBhcy5kYXRhLmZyYW1lKCkKIyBkMSAlPiUgc2VsZWN0KHByb3Auc3QsIHQpICU+JSBncm91cF9ieV9hbGwoKSAlPiUgbXV0YXRlKG49bigpKSAlPiUgdW5pcXVlKCkKcGxvdChmMS5lc3QsIHR5cGUgPSAibCIpCgpgYGAKCgoKYGBge3J9CgpkZjEgPC0gZnVsbF9qb2luKGQxLGQxLGJ5PWNoYXJhY3RlcigpLHN1ZmZpeCA9IGMoIiIsICIueSIpKSAlPiUgZmlsdGVyKHQgIT0gdC55KSAlPiUgbXV0YXRlKHAuZGlzdD1hYnMocHJvcC5zIC0gcHJvcC5zLnkpKQoKCnAubWF0Y2hlcyA8LSBOVUxMCiMgbS5tYXRjaGVzIDwtIE5VTEwKcC5pZHMgPC0gbGlzdChpZHg9TlVMTCxpZHgueT1OVUxMKQojIG0uaWRzIDwtIGxpc3QoaWQ9TlVMTCxzX2lkPU5VTEwpCgpmb3IgKGkgaW4gMToobnJvdyhkZjEpKSkgewogICAgCiAgICBpZiAobnJvdyhkZjEgJT4lIGZpbHRlcighaWR4LnkgJWluJSBwLmlkcyRpZHgueSwgIWlkeCAlaW4lIHAuaWRzJGlkeCkpIT0wKSB7CiAgICAKICAgIHAgPC0gZGYxICU+JSBmaWx0ZXIoIWlkeC55ICVpbiUgcC5pZHMkaWR4LnksICFpZHggJWluJSBwLmlkcyRpZHgpICU+JSAKICAgICAgICAgIGZpbHRlcihwLmRpc3QgPT0gbWluKHAuZGlzdCkpIAogICAgcC5tYXRjaGVzIDwtIHJiaW5kKHAubWF0Y2hlcywgcCkKICAgIHAuaWRzIDwtIHAubWF0Y2hlc1tjKCJpZHgiLCAiaWR4LnkiKV0KICAgIAogICAgIyBtIDwtIGRmMyAlPiUgZmlsdGVyKCFzX2lkICVpbiUgbS5pZHMkc19pZCwgIWlkICVpbiUgbS5pZHMkaWQpICU+JSAKICAgICMgICAgICAgZmlsdGVyKG0uZGlzdCA9PSBtaW4obS5kaXN0KSkgCiAgICAjIG0ubWF0Y2hlcyA8LSByYmluZChtLm1hdGNoZXMsIG0pCiAgICAjIG0uaWRzIDwtIG0ubWF0Y2hlc1tjKCJpZCIsICJzX2lkIildCiAgICB9CiAgICAKfQoKCmRtIDwtIGFzLm1hdHJpeChwLm1hdGNoZXNbLGMoJ3gxJywneDInKV0tcC5tYXRjaGVzWyxjKCd4MS55JywneDIueScpXSkKCiNjb3ZhcmlhbmNlIG1hdHJpeApjIDwtIGNvdihkMVssYygneDEnLCd4MicpXSkKCiMgc29sdmUgIChjb3ZhcmlhbmNlIG1hdHJpeCkgJSolIHggPSBkIGZvciB4CmNvdi5kIDwtIHNhcHBseSgxOm5yb3cocC5tYXRjaGVzKSwgZnVuY3Rpb24oeCkgc29sdmUoYyxkbVt4LF0pKSAlPiUgdCgpCgojIE1haGFsYW5vYmlzIGNhbGN1bGF0aW9uIGZvcmNlZCBpbiB0d28gc3RlcHMKcC5tYXRjaGVzJG0uZGlzdCA8LSBhcHBseShkbSpjb3YuZCwgMSwgc3VtKQoKCnAubWF0Y2hlcyAlPiUgcm93d2lzZSgpICU+JSAKICAgIG11dGF0ZShhPXgxLXgxLnksIGI9eDIteDIueSwKICAgICAgICAgICBtLmQgPSBzdW0oYyhhLGIpKnNvbHZlKGNvdihkMVssYygneDEnLCd4MicpXSksIGMoYSxiKSkpKSAlPiUgc2VsZWN0KC1hLCAtYikKCgpgYGAKCgoKYGBge3J9CgojIGpvaW4oZDEscC5tYXRjaGVzLCIiKQoKZXN0cyA8LSBOVUxMCmIgPC0gTlVMTAoKZm9yIChpIGluIHNlcSgxLChucm93KHAubWF0Y2hlcyktOSksYnk9MikpewogICAgCiAgICBkYXRhIDwtIHAubWF0Y2hlcyAlPiUgYXJyYW5nZShkZXNjKHAuZGlzdCksdCkgJT4lIC5baTpucm93KHAubWF0Y2hlcyksXQogICAgCiAgICBiYWxzIDwtIGJhbC50YWIodCB+IHgxICsgeDIsIGRhdGEgPSBkYXRhLCAKICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA9ICJwcm9wLnMiLCBzLmQuZGVub20gPSAidHJlYXRlZCIpCgogICAgYiA8LSByYmluZChiLGxpc3QoeDEuYmFsID0gYmFscyRCYWxhbmNlWzIsMl0sIHgyLmJhbCA9IGJhbHMkQmFsYW5jZVsxLDJdKSAlPiUgCiAgICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKCkpCiAgICAKICAgIGYxLmwgPC0gbGFwcGx5KGYxLnQsZnVuY3Rpb24oeCkgbG0oeCwgZGF0YT1kYXRhKSkKICAgIAogICAgIyBmMS5zIDwtIHNhcHBseShmMS50LGZ1bmN0aW9uKHgpIGxtKHgsIGRhdGE9ZDEsIHdlaWdodHM9IGQxJHByb3Aud3QpKQogICAgCiAgICAjIGYxLmxbWzk4XV0KICAgIAogICAgZjEuZXN0IDwtIHNhcHBseSgxOmxlbmd0aChmMS5sKSwgZnVuY3Rpb24oeCkgZjEubFtbYyh4LDEsMildXSkKICAgIAogICAgZXN0cyA8LSByYmluZChlc3RzLGNiaW5kKG49aSx2YXJpYW5jZT12YXIoZjEuZXN0KSwgbWF4PW1heChmMS5lc3QpLCBhdj1tZWFuKGYxLmVzdCkpKQoKfQoKZXN0cyA8LSBlc3RzICU+JSBhcy5kYXRhLmZyYW1lKCkKb3V0cHV0IDwtIG91dHB1dCAlPiUgYXMuZGF0YS5mcmFtZSgpCgpjb2xuYW1lcyhvdXRwdXQpPC0gYygibW9kZWwiLCAidmFycyIsICJtYXgudmFsIiwgImF2IikKCm91dHB1dCR2YXJzIDwtIG91dHB1dCR2YXJzICU+JSBhcy5udW1lcmljKCkKCm91dHB1dCRtYXgudmFsIDwtIG91dHB1dCRtYXgudmFsICU+JSBhcy5udW1lcmljKCkKCmBgYAoKCmBgYHtyfQpnZ3Bsb3QocC5tYXRjaGVzLCBhZXMoeDEseDIsIGNvbG9yID0gYXMuZmFjdG9yKHQpKSkgKyAKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW49MCwgeG1heD01LCB5bWluPTAsIHltYXg9NSwgYWxwaGE9MC4xLCBmaWxsPSJibHVlIikgKyAKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW49MSwgeG1heD02LCB5bWluPTEsIHltYXg9NiwgYWxwaGE9MC4xLCBmaWxsPSJyZWQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibHVlIiwgInJlZCIpLCBuYW1lPSJHcm91cCIsIGxhYmVscyA9IGMoIkNvbnRyb2wiLCJUcmVhdCIpKSArCiAgZ2VvbV9zZWdtZW50KGRhdGE9cC5tYXRjaGVzW3AubWF0Y2hlcyR0PT0wLF0sCiAgICAgICAgICAgICAgIGFlcyh4PXgxLHhlbmQ9eDEueSx5PXgyLHllbmQ9eDIueSwgCiAgICAgICAgICAgICAgICAgICBhbHBoYT1jdXQocmFuayhwLmRpc3QpLDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoMSwyLDMsNCkpKSwgCiAgICAgICAgICAgICAgIGNvbG9yPSAiYmxhY2siLCBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMC4yLCJjbSIpKSkgKwogICAgc2NhbGVfYWxwaGFfZGlzY3JldGUobmFtZT0iQ3V0cyIsIGxhYmVscz1jKCIxc3QiLCAiMm5kIiwgIjNyZCIsICI0dGgiKSwgcmFuZ2UgPSBjKDEsMC4xKSkgKwogIGdlb21fcG9pbnQoKSArIHRoZW1lX2NsYXNzaWMoKSAKCgpnZ3Bsb3QocC5tYXRjaGVzW3AubWF0Y2hlcyR0PT0wLF0sIGFlcyhwcm9wLnMscHJvcC5zLnksIGNvbG9yPXAuZGlzdCkpICsgCiAgZ2VvbV9hYmxpbmUoc2xvcGU9MSkgKyBnZW9tX3BvaW50KCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBsaW1zKHg9YygwLDEpLHk9YygwLDEpKSAKCmdncGxvdChwLm1hdGNoZXNbcC5tYXRjaGVzJHQ9PTAsXSwgYWVzKHByb3Aucyxwcm9wLnd0LCBjb2xvcj1wcm9wLnN0KSkgKyAKIGdlb21fcG9pbnQoYWxwaGE9MC43KSArIHRoZW1lX2NsYXNzaWMoKSMgKyBsaW1zKHg9YygwLDEpLHk9YygwLDEpKSAKCmdncGxvdChwLm1hdGNoZXNbcC5tYXRjaGVzJHQ9PTAsXSwgYWVzKHAuZGlzdCwgbS5kaXN0LCBjb2xvcj1wcm9wLnN0KSkgKyAKIGdlb21fcG9pbnQoYWxwaGE9MC43KSArIHRoZW1lX2NsYXNzaWMoKSMgKyBsaW1zKHg9YygwLDEpLHk9YygwLDEpKSAKCmdncGxvdChwLm1hdGNoZXNbcC5tYXRjaGVzJHQ9PTAsXSwgYWVzKHByb3AucyxtLmRpc3QsIGNvbG9yPXByb3Auc3QpKSArIAogZ2VvbV9wb2ludChhbHBoYT0wLjcpICsgdGhlbWVfY2xhc3NpYygpIyArIGxpbXMoeD1jKDAsMSkseT1jKDAsMSkpIAoKYGBgCgoKCgpgYGB7cn0KCmdnYXJyYW5nZSgKZ2dwbG90KGVzdHMsIGFlcyhuLCB2YXJpYW5jZSkpICsgZ2VvbV9saW5lKCkgKyAKICAgIGdlb21faGxpbmUoZGF0YSA9IG91dHB1dCwgYWVzKHlpbnRlcmNlcHQ9dmFycywgY29sb3I9bW9kZWwpKSArCiAgICBsYWJzKHg9Ik51bWJlciBvZiB1bml0cyByZW1vdmVkIiwgeT0iQXZlcmFnZSBlc3RpbWF0ZSB2YXJpYW5jZSIpLAoKZ2dwbG90KGVzdHMsIGFlcyhuLCBtYXgpKSArIGdlb21fbGluZSgpICsgCiAgICBnZW9tX2hsaW5lKGRhdGEgPSBvdXRwdXQsIGFlcyh5aW50ZXJjZXB0PW1heC52YWwsIGNvbG9yPW1vZGVsKSkgKwogICAgbGFicyh4PSJOdW1iZXIgb2YgdW5pdHMgcmVtb3ZlZCIsIHk9Ik1heGltdW0gZXN0aW1hdGUiKSwKCmdncGxvdChlc3RzLCBhZXMobiwgYXYpKSArIGdlb21fbGluZSgpICsgCiAgICBnZW9tX2hsaW5lKGRhdGEgPSBvdXRwdXQsIGFlcyh5aW50ZXJjZXB0PWFzLm51bWVyaWMoYXYpLCBjb2xvcj1tb2RlbCkpICsgCiAgICBsYWJzKHg9Ik51bWJlciBvZiB1bml0cyByZW1vdmVkIiwgeT0iQXZlcmFnZSBlc3RpbWF0ZSIpLApjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kID0gImJvdHRvbSIKKSAlPiUgYW5ub3RhdGVfZmlndXJlKHRvcCA9ICJPdXRwdXQgZm9yIDUxMiBtb2RlbHMgaW5jbHVkaW5nIHNlY29uZCBhbmQgdGhpcmQgb3JkZXIgaW50ZXJhY3Rpb25zIikKCmBgYAoKCmBgYHtyfQoKIyBjb3ZzIDwtIHN1YnNldChwLm1hdGNoZXMsIHNlbGVjdCA9IGMoeDEsIHgyLCB0KSkKIyAKIyBiYWwudGFiKGNvdnMsIHRyZWF0ID0gcC5tYXRjaGVzJHQpCiMgYmFsLnRhYihjb3ZzLCB0cmVhdCA9IHAubWF0Y2hlcyR0LCB3ZWlnaHRzID0gcC5tYXRjaGVzJHByb3Aud3QpCgojIGJhbHMgPC0gYmFsLnRhYih0IH4geDEgKyB4MiwgZGF0YSA9IHAubWF0Y2hlcywgZGlzdGFuY2UgPSAicHJvcC5zIiwgcy5kLmRlbm9tID0gInRyZWF0ZWQiKQoKIyBiYWxzJEJhbGFuY2VbYygyOm5yb3coYmFscyRCYWxhbmNlKSksMl0KCmJhbC53dCA8LSBiYWwudGFiKHQgfiB4MSArIHgyLCBkYXRhID0gcC5tYXRjaGVzLCB3ZWlnaHRzID0gInByb3Aud3QiLAogICAgICAgIGRpc3RhbmNlID0gInByb3AucyIsIHMuZC5kZW5vbSA9ICJ0cmVhdGVkIiwgdW5iYWw9VCkkQmFsYW5jZQoKIyAgICAgICAgICAgIFR5cGUgRGlmZi5BZGoKIyBwcm9wLnMgRGlzdGFuY2UgICAwLjA2OTEKIyB4MSAgICAgIENvbnRpbi4gICAwLjA1MjkKIyB4MiAgICAgIENvbnRpbi4gICAwLjA5MzIKCgpiYWwuc3RyYXQgPC0gYmFsLnRhYih0IH4geDEgKyB4MiwgZGF0YSA9IHAubWF0Y2hlcywgc3ViY2xhc3MgPSAicHJvcC5zdCIsCiAgICAgICAgZGlzdGFuY2UgPSAicHJvcC5zIiwgcy5kLmRlbm9tID0gInRyZWF0ZWQiLCAKICAgICAgICB3aGljaC5zdWJjbGFzcyA9IC5hbGwsIHN1YmNsYXNzLnN1bW1hcnkgPSBUUlVFKSRCYWxhbmNlCgpgYGAKCgoKCgpgYGB7cn0KCmdnYXJyYW5nZSgKZ2dwbG90KGIsIGFlcyh4PXJvdyhiKVssMV0pKSArIGdlb21fbGluZShhZXMoeT14MS5iYWwsIGNvbG9yPSJNYXRjaGVkIikpICsKICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9YmFsLnd0WzIsM10sIGNvbG9yPSJXZWlnaHRlZCIpLCApICsKICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9YmFsLnN0cmF0WzIsM10sIGNvbG9yPSJTdHJhdGlmaWVkIikpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsKICAgIGdlb21fcmliYm9uKGFlcyh5bWluPS0wLjEseW1heD0wLjEpLCBhbHBoYT0wLjIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibGFjayIsICJkYXJrYmx1ZSIsICJibHVlIiksIAogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiTWV0aG9kIikgKyBsYWJzKHRpdGxlPSJ4MSIseD0iIix5PSIiKSwKZ2dwbG90KGIsIGFlcyh4PXJvdyhiKVssMV0pKSArIGdlb21fbGluZShhZXMoeT14Mi5iYWwsIGNvbG9yPSJ4MiBNYXRjaCIpKSArIAogICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1iYWwud3RbMywzXSwgY29sb3I9IngyIFd0IikpICsKICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9YmFsLnN0cmF0WzMsM10sIGNvbG9yPSJ4MiBTdHJhdCIpKSArCiAgICBnZW9tX3JpYmJvbihhZXMoeW1pbj0tMC4xLHltYXg9MC4xKSwgYWxwaGE9MC4yKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiYmx1ZSIsICJkYXJrcmVkIiksIAogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiQ292YXJpYXRlIikgKyBsYWJzKHRpdGxlPSJ4MiIseD0iIix5PSIiKSwKY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9ICJ0b3AiCgopICU+JSBhbm5vdGF0ZV9maWd1cmUodG9wID0gIkNvdmFyaWF0ZSBiYWxhbmNlIGJ5IGRpZmZlcmVuY2UgaW4gc3RhbmRhcmlzZWQgbWVhbnMiLCAKICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSAiU3RhbmRhcmRpc2VkIG1lYW4gZGlmZmVyZW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICBib3R0b20gPSAiTnVtYmVyIG9mIHBhaXJzIHJlbW92ZWQiKQpgYGAKCgpgYGB7cn0KIyBmb3IgKGkgaW4gMToyMDApIHsKIyBzYXBwbHkoMjAwLCBmdW5jdGlvbih4KSBmb3IoaSBpbiAxOngpIHttZWFuKHJub3JtKDIwMCkpfSkKIyB9CmBgYAoKCgpgYGB7cn0KZGlzdGFuY2UgPC0gZml0dGVkKGdsbSh0cmVhdH5hZ2UrZWR1YyxsYWxvbmRlLCBmYW1pbHk9ImJpbm9taWFsIikpCgpzcHJvYnMgPC0gc2VxKDAsIDEsIGxlbmd0aC5vdXQgPSByb3VuZCg2KSArIDEpCgpxdWFudGlsZShkaXN0YW5jZVtsYWxvbmRlJHRyZWF0PT0xXSwgcHJvYnMgPSBzcHJvYnMsIG5hLnJtID0gVFJVRSkKCmBgYAoKCmBgYHtyfQptYXRjaCA8LSBtYXRjaGl0KHRyZWF0fmFnZStlZHVjLCBsYWxvbmRlLCBkaXN0YW5jZSA9ICJtYWhhbGFub2JpcyIgLCByZXBsYWNlID0gVCwgbS5vcmRlciA9ICJkYXRhIikKIyBzdW1tYXJ5KG1hdGNoKQoKbWF0Y2gub3V0IDwtIG1hdGNoLmRhdGEobWF0Y2gpCiMgc3VtbWFyeShtYXRjaC5vdXQpCgojIGdncGxvdChtYXRjaC5vdXQsIGFlcyhlZHVjLCBhZ2UpKSArIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHRyZWF0KSkpICsgZ2VvbV9saW5lKGFlcyhncm91cD1zdWJjbGFzcykpCgpkLm1hdHJpeCA8LSBvcHRtYXRjaDo6bWF0Y2hfb24oZGlzdGFuY2UsIHo9bGFsb25kZSR0cmVhdCwgc3RhbmRhcmRpemF0aW9uLnNjYWxlPTEpCmQubWF0cml4IDwtIG9wdG1hdGNoOjptYXRjaF9vbihtYXRjaCRmb3JtdWxhLCBkYXRhID0gbGFsb25kZSwgbWV0aG9kID0gIm1haGFsYW5vYmlzIikKZC5tYXRyaXgyIDwtIG9wdG1hdGNoOjptYXRjaF9vbihtYXRjaCRmb3JtdWxhLCBkYXRhID0gbGFsb25kZSwgbWV0aG9kID0gIm1haGFsYW5vYmlzIiwgc3RhbmRhcmRpemF0aW9uLnNjYWxlPTEpCgoKbWF0IDwtICBkaXN0Lm1hdGNoZXMoZC5tYXRyaXgsIHJlcGxhY2UgPSBULCBvcmRlciA9ICJkYXRhIikKCgptYXQgJT4lIAoKIyBtYXRjaCRtYXRjaC5tYXRyaXg9PWFzLm1hdHJpeChtYXRbWydjb250cm9sJ11dKQoKIyBjYmluZChtYXQsIG1hdGNoaXQgPSBtYXRjaCRtYXRjaC5tYXRyaXgpICU+JSBmaWx0ZXIoY29udHJvbCE9bWF0Y2hpdCkKCmxhbG9uZGVbbWF0JHRyZWF0bWVudCxdCmxhbG9uZGVbbWF0JGNvbnRyb2wsXQoKY2JpbmQodD1sYWxvbmRlW21hdCR0cmVhdG1lbnQsXSwgYz1sYWxvbmRlW21hdCRjb250cm9sLF0sbWF0KSAlPiUgZGltKCkKCgpkYXRhLmZyYW1lKElEcz1jKG1hdCR0cmVhdG1lbnQsIG1hdCRjb250cm9sKSkgJT4lICBzdW1tYXJpc2UobklEcz1uKCksIC5ncm91cHMgPSBJRHMpCgp0KHRhYmxlKGMobWF0JHRyZWF0bWVudCwgbWF0JGNvbnRyb2wpKSkgJT4lIGRpbSgpCgp0YWJsZShtYXQkY29udHJvbClbbWF0JGNvbnRyb2xdICU+JSBkaW0oKQpgYGAKCgoKYGBge3J9CgpkaXN0KCkKCmBgYAoK